<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="APCbc" id="APCbc"><span data-lake-id="ud0211452" id="ud0211452">典型回答</span></h1>
  <p data-lake-id="u3bbad1bd" id="u3bbad1bd"><br></p>
  <p data-lake-id="u81ce7ff9" id="u81ce7ff9"><br></p>
  <p data-lake-id="uc828731c" id="uc828731c"><span data-lake-id="ue0253f9d" id="ue0253f9d">Redis的键有两种过期方式：一种是被动过期，另一种是主动过期。</span></p>
  <p data-lake-id="ua4c40be9" id="ua4c40be9"><span data-lake-id="ub4e8eb13" id="ub4e8eb13">​</span><br></p>
  <p data-lake-id="u800c5d56" id="u800c5d56"><span data-lake-id="ucd5b7e42" id="ucd5b7e42">主动过期会在定时的去删除key，那么带来一个问题，那就是：Redis中如果有一批key同时过期，会导致其它key的读写效率降低</span></p>
  <p data-lake-id="u8f873498" id="u8f873498"><span data-lake-id="u38821792" id="u38821792">​</span><br></p>
  <p data-lake-id="u39b4f775" id="u39b4f775"><span data-lake-id="ub655c4b1" id="ub655c4b1">原因是因为Redis的主动过期定时任务也是在Redis的单线程模型中的主线程中执行的，也就是说如果出现了一批key同时过期，就需要删除大量的Key。那么因为命令执行是单线程的，所以这时候后面来的业务操作请求，就需要等这个删除命令执行完才可以处理业务请求。</span></p>
  <p data-lake-id="ua098fd77" id="ua098fd77"><span data-lake-id="u6e127240" id="u6e127240">​</span><br></p>
  <p data-lake-id="uac3f06ac" id="uac3f06ac"><span data-lake-id="u9d612db4" id="u9d612db4">那么这时候就会出现，业务访问延时增大的问题。</span></p>
  <p data-lake-id="u136ca7df" id="u136ca7df"><span data-lake-id="ueb53908c" id="ueb53908c">​</span><br></p>
  <p data-lake-id="ufde2cd0d" id="ufde2cd0d"><strong><span data-lake-id="u15a5df6d" id="u15a5df6d">如何解决这个问题呢？</span></strong><span data-lake-id="u33790754" id="u33790754">有以下几个思路：</span></p>
  <p data-lake-id="u65a28e13" id="u65a28e13"><span data-lake-id="u7829e7ec" id="u7829e7ec">​</span><br></p>
  <p data-lake-id="uc1b39ae8" id="uc1b39ae8"><strong><span data-lake-id="u4850f099" id="u4850f099">使用随机过期时间</span></strong><span data-lake-id="uc3205163" id="uc3205163">：如果可能的话，可以将键的过期时间随机分布，而不是在同一时间点过期。这样可以分散过期键删除的压力，避免大规模的键同时过期。同时也能避免缓存雪崩的问题。</span></p>
  <p data-lake-id="uaadfbae0" id="uaadfbae0"><span data-lake-id="ud07e1e5e" id="ud07e1e5e">​</span><br></p>
  <p data-lake-id="u631e1d30" id="u631e1d30"><strong><span data-lake-id="u4f74c6f2" id="u4f74c6f2">使用被动删除</span></strong><span data-lake-id="u217b8420" id="u217b8420">：被动删除在每次访问的时候才会去删除key，并不会定时删除，不太容易发生大量key同时被删除的情况。但是被动删除可能会导致内存占用比较多。</span></p>
  <h1 data-lake-id="HgCgU" id="HgCgU"><br></h1>
  <p data-lake-id="u4cc644ee" id="u4cc644ee"><br></p>
  <p data-lake-id="u090d5a09" id="u090d5a09"><br></p>
 </body>
</html>